// puntatori a tipi derivati

#include <iostream>
using namespace std;
class base {
	int i;
public:
void set_i (int num) {i = num;}
int get_i() {return i;}
};

class derived: public base {
	int j;
public:
	void set_j(int num) {j=num;}
	int get_j() {return j;}
};

int main()
{
	base *bp;
	derived d;

	bp = &d; // il puntatore base punta all'oggetto derivato
	// accesso all'oggetto derivato utilizzando il puntatore base
	bp->set_i(10);
	cout << bp->get_i() << " " <<endl;
/* questo non funziona. Non è possibile accedere a un elemento di una classe derivata
utilizzando un puntatore alla classe base.
	bp ->set_j(88); // errore
	cout << bp->get_j(); // errore
*/
	return 0;
}

/* accesso consentito grazie al cast
((derived *)bp)->set_j(88);
cout <<((derived *)bp)->get_j();*/
